home *** CD-ROM | disk | FTP | other *** search
/ Die Ultimative Software-P…i Collection 1996 & 1997 / Die Ultimative Software-Pakete CD-ROM fur Atari Collection 1996 & 1997.iso / g / gnu_c / gccdoc.lzh / GCC-ST.STW (.txt) next >
Encoding:
Atari Works Document  |  1994-01-31  |  194.6 KB  |  1,015 lines

  1. Swiss 721
  2. Cooper Black
  3. Swiss 721
  4. Cooper Black
  5. How to install and use GCC on your Atari ST or TT
  6. Copyright (C) 1991 Frank Ridderbusch
  7. Author          : Frank Ridderbusch T35
  8. Created On      : around 1 1/2 years ago
  9. Last Modified By: Frank Ridderbusch
  10. Last Modified On: Wed Sep 23 22:43:30 1992
  11. Update Count    : 88
  12. Status          : Beware, this version is not finished yet.
  13. HISTORY 
  14. 31-Jan-1994        Michael White
  15.    Changed format to AtariWriter and text format.
  16. 20-Dec-1991        Frank Ridderbusch T35    
  17.     Last Modified: Fri Dec 20 11:34:04 1991
  18.     Include chapter about C++ compiler driver options
  19. 20-Dec-1991        Frank Ridderbusch T35    
  20.     Last Modified: Fri Dec 20 08:58:56 1991
  21.     Restructuring the utilities chapter. Various minor changes.
  22. 6-Dec-1991        Frank Ridderbusch T35    
  23.     Last Modified: Fri Dec  6 11:21:19 1991
  24.     Run this file through ispell.
  25. Introduction
  26. ************
  27. This file documents the usage of the GNU C compiler on the Atari ST & TT computers and contains material from other copyrighted GNU manuals. The version of the C and C++ compiler, on which this manual is based are mainly 1.40 and 1.40.0 and some facts are from GCC 2.x. This manual does not yet cover GCC 2.x in it's complete beauty.
  28. Copyright (C) 1988, 1989, 1990 Free Software Foundation, Inc.
  29.           1990, 1991, 1992 Frank Ridderbusch
  30. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
  31. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the section entitled "GNU CC General Public License" is included exactly as in the original, and provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.
  32. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that the section entitled ``GNU CC General Public License'' and this permission notice may be included in translations approved by the Free Software Foundation instead of in the original English.
  33. Copyright 1988, 1989, 1990 Free Software Foundation, Inc.
  34. Copyright 1990, 1991, 1992 Frank Ridderbusch
  35. Introduction
  36. This manual documents how to install and run the GNU C compiler on the Atari ST & TT computers. 
  37. Beware, this version is not finished yet. GCC 2.x is not yet completly covered, but since the majority of options is equal to GCC 1.x, this is not a real problem. Also GAS 1.92 is pending.
  38. GNU CC GENERAL PUBLIC LICENSE
  39.   The license agreements of most software companies keep you at the mercy of those companies.  By contrast, our general public license is intended to give everyone the right to share GNU CC.  To make sure that you get the rights we want you to have, we need to make restrictionsthat forbid anyone to deny you these rights or to ask you to surrender the rights.  Hence this license agreement.
  40. Specifically, we want to make sure that you have the right to give away copies of GNU CC, that you receive source code or else can get it if you want it, that you can change GNU CC or use pieces of it in new free programs, and that you know you can do these things.
  41.   To make sure that everyone has such rights, we have to forbid you to deprive anyone else of these rights.  For example, if you distribute copies of GNU CC, you must give the recipients all the rights that you have.  You must make sure that they, too, receive or can get the source code.  And you must tell them their rights.
  42.   Also, for our own protection, we must make certain that everyone finds out that there is no warranty for GNU CC.  If GNU CC is modified by someone else and passed on, we want its recipients to know that what they have is not what we distributed, so that any problems introduced by others will not reflect on our reputation.
  43.   Therefore we (Richard Stallman and the Free Software Foundation, Inc.) make the following terms which say what you must do to be allowed to distribute or change GNU CC.
  44. COPYING POLICIES
  45. You may copy and distribute verbatim copies of GNU CC source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy a valid copyright notice "Copyright Free Software Foundation, Inc." (or with whatever year is appropriate); keep intact the notices on all files that refer to this License Agreement and to the absence of any warranty; and give any other recipients of the GNU CC program a copy of this License Agreement along with the program.  You may charge a distribution fee for the physical act of transferring a copy.
  46. You may modify your copy or copies of GNU CC or any portion of it, and copy and distribute such modifications under the terms of Paragraph 1 above, provided that you also do the following:
  47. - cause the modified files to carry prominent notices stating that you changed the files and the date of any change; and
  48. - cause the whole of any work that you distribute or publish, that in whole or in part contains or is a derivative of GNU CC or any part thereof, to be licensed at no charge to all third parties on terms identical to those contained in this License Agreement (except that you may choose to grant more extensive warranty protection to some or all third parties, at your option).
  49. You may charge a distribution fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
  50. Mere aggregation of another unrelated program with this program (or its derivative) on a volume of a storage or distribution medium does not bring the other program under the scope of these terms.
  51. You may copy and distribute GNU CC (or a portion or derivative of it, under Paragraph 2) in object code or executable form under the terms of Paragraphs 1 and 2 above provided that you also do one of the following:
  52. - accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Paragraphs 1 and 2 above; or,
  53. - accompany it with a written offer, valid for at least three years, to give any third party free (except for a nominal shipping charge) a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Paragraphs 1 and 2 above; or,
  54. - accompany it with the information you received as to where the corresponding source code may be obtained.  (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form alone.)
  55. For an executable file, complete source code means all the source code for all modules it contains; but, as a special exception, it need not include source code for modules which are standard libraries that accompany the operating system on which the executable file runs.
  56. You may not copy, sublicense, distribute or transfer GNU CC except as expressly provided under this License Agreement.  Any attempt otherwise to copy, sublicense, distribute or transfer GNU CC is void and your rights to use the program under this License agreement shall be automatically terminated.  However, parties who have received computer software programs from you with this License Agreement willnot have their licenses terminated so long as such parties remain in full compliance.
  57. If you wish to incorporate parts of GNU CC into other free programs whose distribution conditions are different, write to the Free Software Foundation at 675 Mass Ave, Cambridge, MA 02139.  We have not yet worked out a simple rule that can be stated here, but we will often permit this.  We will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software.
  58. Your comments and suggestions about our licensing policies and our software are welcome!  Please contact the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, or call (617) 876-3296.
  59. NO WARRANTY
  60.   BECAUSE GNU CC IS LICENSED FREE OF CHARGE, WE PROVIDE ABSOLUTELY NO WARRANTY, TO THE EXTENT PERMITTED BY APPLICABLE STATE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING, FREE SOFTWARE FOUNDATION, INC, RICHARD M. STALLMAN AND/OR OTHER PARTIES PROVIDE GNU CC "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF GNU CC IS WITH YOU.  SHOULD GNU CC PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
  61.  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL RICHARD M. STALLMAN, THE FREE SOFTWARE FOUNDATION, INC., AND/OR ANY OTHER PARTY WHO MAY MODIFY AND REDISTRIBUTE GNU CC AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY LOST PROFITS, LOST MONIES, OR OTHER SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS) GNU CC, EVEN IF YOU HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY.
  62. Contributors to GNU CC
  63.   In addition to Richard Stallman, several people have written parts of GNU CC.
  64. - The idea of using RTL and some of the optimization ideas came from the U. of Arizona Portable Optimizer, written by Jack Davidson and Christopher Fraser.  See ``Register Allocation and Exhaustive Peephole Optimization'', Software Practice and Experience 14 (9), Sept. 1984, 857-866.
  65. - Paul Rubin wrote most of the preprocessor.
  66. - Leonard Tower wrote parts of the parser, RTL generator, RTL definitions, and of the Vax machine description.
  67. - Ted Lemon wrote parts of the RTL reader and printer.
  68. - Jim Wilson implemented loop strength reduction and some other loop optimizations.
  69. - Nobuyuki Hikichi of Software Research Associates, Tokyo, contributed the support for the SONY NEWS machine.
  70. - Charles LaBrec contributed the support for the Integrated Solutions 68020 system.
  71. - Michael Tiemann of MCC wrote most of the description of the National Semiconductor 32000 series cpu.  He also wrote the code for inline function integration and for the SPARC cpu and Motorola 88000 cpu and part of the Sun FPA support.
  72. - Jan Stein of the Chalmers Computer Society provided support for Genix, as well as part of the 32000 machine description.
  73. - Randy Smith finished the Sun FPA support.
  74. - Robert Brown implemented the support for Encore 32000 systems.
  75. - David Kashtan of SRI adapted GNU CC to the Vomit-Making System.
  76. - Alex Crain provided changes for the 3b1.
  77. - Greg Satz and Chris Hanson assisted in making GNU CC work on HP-UX for the 9000 series 300.
  78. - William Schelter did most of the work on the Intel 80386 support.
  79. - Christopher Smith did the port for Convex machines.
  80. - Paul Petersen wrote the machine description for the Alliant FX/8.
  81. Aside from Michael Tiemann, who worked out the front end for GNU C++, and Richard Stallman, who worked out the back end, the following people (not including those who have made their contributions to GNU CC) should not go unmentioned.
  82. - Doug Lea contributed the GNU C++ library.  This includes support for streams, obstacks, structured files, and other public service objects.
  83. - Doug Schmidt has spent countless hours pursuing bugs in this compiler for sport.  He also wrote a perfect hash function generator in GNU C++ which was used to generate a replacement for the keyword recognizer in the lexical analyzer for both GNU CC and GNU C++.
  84. - Marc Shapiro and Phillipe Gautron helped me implement features needed for the SOR distributed object management environment.
  85. - Dirk Grunwald made the collect program usable under COFF.
  86. - Angel Li adapted GNU C++ to VMS.
  87. - Ron Cole provided additional help getting GNU C++ working on COFF-based systems.
  88. - James Clark wrote a name demangler for the GNU C++ naming scheme, and integrated it with the linker.
  89. - Michael Powell and Jim Mitchell helped design the GNU C++ exception handling mechanism.
  90. The following people contributed specially to the version for the Atari ST & TT.
  91. - John R. Dunning did the original port to the Atari ST.
  92. - Jwahar R. Bammi improved the port and the libraries.
  93. - Eric R. Smith wrote lots of code for the libraries.
  94. - David Boyce ported G++ 1.39.1 and the libg++ 1.39.0 to the ST.
  95. The following is a not necessarily complete list of people who either contributed code or bugfixes to the libraries: Michal Jaegermann, Scott Kolodzieski, Andreas Schwab, Frank Celler, Edgar Roeder, Kai-Uwe Bloem, Allan Pratt, Jens Tingleff, Thomas Koenig, Markus Nick. Apologies to those I forgot to mention.
  96. Frank Ridderbusch compiled this manual specially for the Atari ST.
  97. Introduction
  98.   This manual documents how to install and run the GNU C compiler on the Atari ST & TT computers. It does not give an introduction in C or M68000 assembler. There is enough material on both subjects available. The user, who is familiar with a C compiler, that runs on a U**x system, should have no trouble at all to get GNU C running on the Atari ST. This manual was compiled from existing GNU manuals and various bits and pieces from John R. Dunning and Jwahar R. Bammi.
  99.   The sections, which describe the compiler driver, the preprocessor and the G++ compiler driver are nearly verbatim copies of sections in the respective manuals. The original manuals (
  100. Using and Porting GNU CC 
  101. The C Preprocessor
  102. ), were written by Richard M. Stallman and Michal D. Tieman (
  103. User's Guide to GNU C++
  104. ). All of these three documents are copyright The Free Software Foundation. I modified these sections by removing material, which described features of GNU C for systems like Vaxen or Suns. To keep this manual reasonably compact, I extracted only the sections, which describe the supported command options (and predefined macros in case of the preprocessor). If the user is interested in the extensions and details, which are implemented in GNU C, he has to refer to the original manuals. Whether all described options are useful on the Atari has to be decided.
  105.   The facts, which are presented in the assembler and utility sections are mostly derived from the sources of the respective programs (from a cross compiler kit by J. R. Bammi based on GNU C 1.31), which were available to me. Other facts were gathered by try and error. So, these sections may be a bit shaky.
  106.   The first version of this manual was based on GCC 1.37.1. Then, GCC 1.40 and G++ 1.39.1 became available. The most noticeable differences were some new options ("-mint", "-G", "-z") and the extended symbol table format. In the beginning of 1992 the FSF released GCC 2.x. In this release GCC and G++ were merged into one large package. At the time of this writing the current version for the Atari is 2.2.2 with patchlevel 2. This manual doesn't cover all new command line options from GCC 2.2.2, but only the most valuable (in the authors opinion). 
  107.  The coverage of GCC 2.x is not yet complete. Also, GAS 1.92 is pending.
  108.   Additionally two flavours of libraries are present. One version, which is now mostly maintained by J.R.Bammi, is for the ST running the native TOS operating system. The other flavour is maintained by E.R.Smith. This version is specially modified to support MiNT, the multitasking TOS extension, also from E.R.Smith. It is the aim of both maintainers to keep the libraries in sync as much as possible and possibly merge them together in the future.
  109. (Changes are on the way to merge the two library sets into one. Jeff Jackson is currently writing a tsr (terminate and stay resident), that provides the UNIXMODE functionality for the extended file sytem at the system trap level aka the kernel. This extended file system functionality will then be removed from the library.)
  110.   The best place to look for all the components (binaries and sources) is at the moment the Atari archive at terminator. The internet address for anonymous ftp is atari.archive.umich.edu (141.211.164.8).  Also a mail server called BART is active. Send a message with the word "help" in it to the address atari@atari.archive.umich.edu and BART will explain himself. The maintainers of this archive post a monthly message to the USENET newsgroup "comp.sys.atari.st", which explains, how to get things from the archive. The packaging of the files may be different as it is explained below.
  111.   If you find any errors or typos in this manual or have any other comments, please let me know. My email address is:
  112. ridderbusch.pad@sni-usa.com
  113. (Amerika (North & South))
  114. ridderbusch.pad@sni.de
  115. (Rest of world)
  116. Frank_Ridderbusch@pb.maus.de
  117. (MausNet, a FIFO like network in Germany)
  118. Installation
  119.   There are basically three components, which make up a basic compiling system and which have to be installed. Each component is accessed via an environment variable. This three components are:
  120. The executables
  121. These are accessed via the normal "PATH" variable, by which all other programs are found and the variable "GCCEXEC".
  122. The header files
  123. The preprocessor accesses the header files via the variable "GNUINC". Any C++ header files are accessed via "GXXINC".
  124. The libraries
  125. The linker finds the startup file and the required libraries via the variable "GNULIB". The C++ library also belongs into this directory. 
  126.   All this stuff basically assumes that you're using a CLI (command line interpreter). A really good choice is "Gulam", which has very nice set of features, but there are quite a number of other CLI's around, which also might do the job. If want as much U**x feeling as possible, you might consider either "ash", which is compatible to the Bourne shell (ported by Stefan Neuhaus), or E.R.Smiths port of "tcsh" or Scott Kolodzieskis port of "BASH 1.12".
  127.   Apart from the CLI you definitely should get yourself a "
  128. make" utility. Again, good choices here are either the GNU "Make", which offers nearly the complete U**x make functionality on the ST or the "PDMAKE", which has only the core make functionality, but has on the other hand the advantage, that it requieres fewer system resources.
  129.   I suggest the following directory structure on your disk partition:
  130. \gnu\bin
  131. for all executable programs. The compiler driver finds the executables in this directory by looking up the environment variable "GCCEXEC".
  132. \gnu\lib
  133. for the startup object modules and the libraries. The linker find the startup code and the libraries in this directory by looking up the variable "GNULIB".
  134. \gnu\include
  135. for the header files. The preprocessor finds the include file in this directory by looking up the environment variable "GNUINC".
  136.   With earlier versions of GNU CC it was only allowed to put one path into the variables "GNULIB" and "GNUINC". GCC 1.37 and later allows you to put several paths into these variables, which are separated by either a "," or a ";". All the mentioned paths are searched in order to locate a specific file. However the startup module "crt0.o" is 
  137.  looked for in the first directory specified in "GNULIB". If the preprocessor can't find a include file in one of the directories specified by "GNUINC", it will also search the paths listed in "GNULIB".
  138. Installing the Executables
  139.   The compressed archive of the GNU C compiler binary distribution contains the 'common' executables of the GNU compiler. That means the compiler driver ("gcc.ttp"), the preprocessor ("gcc-cpp.ttp"), the main body ("gcc-cc1.ttp"), the assembler ("gcc-as.ttp") and the linker ("gcc-ld.ttp"), but depending from where you got your GCC the packaging might be different. The just mentioned programs are the absolute minimum. To be comfortable, you should get the following support programs:
  140. gcc-ar.ttp
  141. is the object library maintainer.
  142. gdb.ttp
  143. is the GNU debugger 2.6 modified for the Atari ST. John Dunning did the original port to the Atari. Since then Jwahar Bammi has extensively hacked it. GDB now uses DBX debugging information in the object files.  This requires an assembler with version 1.36 or greater.
  144. sym-ld.ttp
  145. creates the symbol file needed with GDB.
  146. gcc-nm.ttp
  147. prints the symbols of a GNU object library or an object file.
  148. cnm.ttp
  149. prints the symbol table of a GEMDOS executable.
  150. fixstk.ttp
  151. printstk.ttp
  152. are used to modify and print the current stack size of an executable.
  153. toglclr.ttp
  154. TOS 1.4 users can toggle the clear above BSS to end of TPA flag for the GEMDOS loader. A newer version of "toglclr.ttp" also allows to toggle the loader bits, that were introduced with TOS versions 2.x and 3.x.
  155. size68.ttp
  156. This program list the values of the TEXT, DATA, and BSS sections of a ready to run executable.
  157. xstrip.ttp
  158. removes the symbol table from an executable.
  159.   All this files should go in "\gnu\bin\" directory on your gnu disk. I personally keep my executables in the directory "e:\gnu\bin". You should than extend the search path of your CLI to include this directory or you move the compiler driver "gcc.ttp" and the files, which are 
  160.  invoked by "gcc.ttp" ("gcc.ttp" calls "gcc-cpp.ttp", "gcc-cc1.ttp", "gcc-as.ttp" and "gcc-ld.ttp") into the directory, where you keep your other executables. The next step is to actually define "GCCEXEC".  "gcc.ttp" uses this variable to locate the
  161. preprocessor, compiler, assembler and the linker.  "GCCEXEC" contains a device/dir/partial-pathname, which not only consists of the directory, where the executables are kept, but also a common prefix, which is "gcc-". Assuming you also put the executables in the directory as described above, "GCCEXEC" would contain "e:\gnu\bin\gcc-". The value is the same, you would give the compiler driver with the "-B" option.
  162.   Then you should define a variable called "TEMP". During compilation the output of the various intermediate stages is kept here.  The variable must 
  163.  contain a trailing backslash. If you have enough memory, "TEMP" should point to a ramdisk.
  164. Installing the Libraries
  165.   The next thing to do is to install the libraries. The distributed archive contains the following libraries (again, the packaging may vary):
  166. crt0.o
  167. gcrt0.o
  168. are the startup object modules. The file "gcrt0.o" instead of "crt0.o" is used, if the sources files are compiled for execution profiling (the "-pg" option).
  169. gnu.olb
  170. gnu16.olb
  171. are the standard libraries, the usual "libc" on other systems.
  172. curses.olb
  173. curses16.olb
  174. are ports of the BSD curses.
  175. gem.olb
  176. gem16.olb
  177. contain the Atari ST Aes/Vdi/FSM-GDOS bindings.
  178. iio.olb
  179. iio16.olb
  180. contain the integer only "printf" and "scanf" functions.
  181. pml.olb
  182. pml16.olb
  183. are the portable math libraries.
  184. termcap.olb
  185. termcap16.olb
  186. are for the pure "termcap" support.
  187. widget.olb
  188. widget16.olb
  189. are a small widget based on "curses"
  190.   All these libraries go to a place described by the environment variable "GNULIB". Again this variable must 
  191. contain a trailing backslash. Staying with the above example, I've set the variable to "e:\gnu\lib". The libraries, which have a 16 in their names were compiled with the "-mshort" option. This makes integers the same size as shorts.
  192.   If you like to write programs for MiNT, the TOS multitasking extension from E.R.Smith, you might consider to replace "gnu.olb", "gnu16.olb", "iio.olb" and "iio16.olb" with the libraries supplied by Eric Smith. The source and the binaries of these libraries can also be retrieved from the Atari archive at terminator. The files are "mntlib
  193. .zoo for the sources and mntolb
  194. .zoo for the binaries. They are found in the "mint" directory.  
  195.  is the version number, currently 20. Programs written with this libraries will also run under TOS, as long no MiNT specific features have been used. (See 
  196. The C-Compiler Driver
  197. , for more info on compiling programs for MiNT (the "-mint" option))
  198.   Another option is to have both sets of libraries installed. For this you have to rename the MiNT libraries according to the following scheme:
  199. crt0.o ==> mcrt0.o
  200. gcrt0.o ==> mgcrt0.o
  201. gnu.olb ==> mint.olb
  202. gnu16.olb ==> mint16.olb
  203.   To select these files instead of the standard TOS versions and to activate the MiNT specific portions of the header files you have to include the "-mint" option in the "gcc.ttp" command line.
  204. Installing the Header Files
  205.   The last bit to install are the header files. They are contained in an archive of their own. The preprocessor now knows about the variable "GNUINC". Earlier version had to use the "-I  {prefix}" option, to get to the header files. According to the above examples, the files would be put in the directory "e:\gnu\include".  "GNUINC" has to be set accordingly.
  206.   If you like to write programs for MiNT, apart from the libraries you also need the MiNT specific include files (also from the Atari archive). These are found in the archive "mntinc
  207. .zoo in the "mint" directory.  
  208.  matches the version number of the library. (See 
  209. The C-Compiler Driver
  210.  for more info on compiling programs for MiNT (the "-mint" option)).
  211.   If you choose to have both sets of libraries installed you can keep the TOS specific header files since they are compatible with the MiNT ones. 
  212. Gulam Notes
  213.   The programs, which come with the GCC distribution also understand filenames, which use the slash ("/") as a separator. When Gulam is your favorite CLI you will stick to the backslashes, since you otherwise lose the feature of command line completition.
  214.   If you are using Gulam, you can define "aliases" to reach the executables under more common names.
  215. Examples
  216. alias cc e:\gnu\bin\gcc.ttp
  217. alias ar e:\gnu\bin\gcc-ar.ttp
  218. alias as e:\gnu\bin\gcc-as.ttp
  219. alias ld e:\gnu\bin\gcc-ld.ttp
  220.   Now you should be able to say "cc foo.c -o foo.ttp and the obvious thing should happen. If you still have trouble, compare your settings with the ones from the sample file "gulam.g". That should give you the right idea.
  221.   One additional note to Gulam.  "crt0.o" is currently set up to understand the MWC/Atari convention of passing long command lines (except it doesn't look into the "_io_vector" part). Gulam users should set "env_style mw", if you want to give long args lines to "gcc.ttp".
  222.   To summarize the above, here are the settings from my "gulam.g" initialization file. The usage of "UNIXMODE" environment variable is explained in the file "unixmode.doc", which is part of the library sources. The "GXXINC" variable is for G++.
  223. set env_style mw
  224. setenv TEMP i:
  225. setenv PATH e:\gnu\bin;<your other search paths here>
  226. setenv GCCEXEC e:\gnu\bin\gcc-
  227. setenv GNULIB e:\gnu\lib
  228. setenv GNUINC e:\gnu\include
  229. setenv GXXINC e:\gnu\g++-inc
  230. setenv UNIXMODE 'd/brG'
  231. Installing G++
  232.   For the G++ installation apply the same rules as for the GCC installation. The G++ compiler driver "g++.ttp" and the actual compiler "gcc-cc1+.ttp" belong in the same directory as the GCC executables. The preprocessor is shared between G++ and GCC. The library "g++.olb" goes into the same directory as all the other libraries. Since G++ has a complete set of include files of it's own, they all should be copied into the directory "\gnu\g++-inc". To let the preprocessor know, where it can find the include files, the variable "GXXINC" is used.
  233.   The above is valid for G++ 1.xx. Since GCC and G++ were merge into one large package with version 2.x, there is no longer a special compiler driver for G++.  "gcc.ttp" determines from the file extension, whether the C or C++ compiler should be invoked. The file "gcc-cc1plus.ttp" is the actual C++ compiler. This file name is usually truncated to "gcc-cc1p.ttp" in the 8+3 TOS file system. What is said about the include files and the variable "GXXINC" is also true for G++ 2.x.
  234.   To actually use G++, some requirements have to be fulfilled. You need the GCC include files and libraries with at least patch level 72.  Additionally the linker "gcc-ld.ttp" must have at least patch level 22.
  235.   The library "g++.olb" is at the moment not 100% 16bit clean. That means, there is at the moment no version, which is compiled with the "-mshort" option.
  236. Memory Requirements
  237.   GCC loves memory. A lot. It loves to cons structures. Lots of them. Earlier versions probably won't run at all in less than 1 Meg; the version 1.36 of GCC will probably need 2 Meg. The "gcc-cc1.ttp" had 1/2 meg stack, and needs it for compiling large files with optimization turned on. Happily, it doesn't need all that stack for smaller files, or even big files without the "-O" option, so it should be feasible to make a compiler with a smaller stack (with "fixstk.ttp").
  238.   GCC versions 1.37 and later uses another scheme for memory allocation. The programs "gcc-cpp.ttp" and "gcc-cc1.ttp" are setup for "_stksize == -1L".  This means, that an executable will use all available memory, doing mallocs from internal heap (as opposed to the system heap via "Malloc"), with "SP" initially set at the top, and heap starting just above the "BSS". So if the compiler runs out of memory, you probably need more memory (or get rid of accessories, tsr's etc and try).
  239.   During my compilation of @TeX 3.1 on my ST, I found that the size of a source file is not main the limiting factor, but the size of a function. At that time my ST was equipped with 2.5 megs of memory. About 512 Kb was used for ramdisk, cache and some auto folder programs. With this configuration the maximum size of a function, which could be compiled, was about 14-20 KB depending on how much code was inlined. Additionally I was able to compile GCC 1.40 and GAS 1.38 on my ST, but for this I had nearly disable every program in the auto folder. So, with GCC 1.40 you're doing fine with at least 2.5 megs.
  240.   With GCC 2.2 you definitly need more memory. The compiler executable itself is about 850 Kb in size. The C++ compiler is even larger (about 1.1 Mb). So, with GCC 2.2 you should have 4 Mb.
  241. Controlling the C-Compiler Driver ("gcc.ttp")
  242.   The GNU C compiler uses a command syntax much like the U**x C compiler. The "gcc.ttp" program accepts options and file names as operands.  Multiple single-letter options may 
  243.  be grouped: "-dr" is very different from "-d -r".
  244.   When you invoke GNU CC, it normally does preprocessing, compilation, assembly and linking. File names which end in ".c" are taken as C source to be preprocessed and compiled; file names ending in ".i" are taken as preprocessor output to be compiled; compiler output files plus any input files with names ending in ".s" are assembled; then the resulting object files, plus any other input files, are linked together to produce an executable.
  245.   Command options allow you to stop this process at an intermediatestage.
  246.   For example, the "-c" option says not to run the linker. Then the output consists of object files output by the assembler.
  247.   Other command options are passed on to one stage of processing. Some options control the preprocessor and others the compiler itself. Yet other options control the assembler and linker; these are not documented here, but you rarely need to use any of them.
  248.   Here are the options to control the overall compilation process, including those that say whether to link, whether to assemble, and so on.
  249. -o {file}
  250. Place output in file {file}. This applies regardless to whatever sort of output is being produced, whether it be an executable file, an object file, an assembler file or preprocessed C code.
  251. If "-o" is not specified, the default is to put an executable file in "a.out", the object file {source}.c in {source}.o", an assembler file in {source}.s, and preprocessed C on standard output.
  252. Compile or assemble the source files, but do not link. Produce object files with names made by replacing ".c" or ".s" with ".o" at the end of the input file names. Do nothing at all for object files specified as input.
  253. Compile into assembler code but do not assemble. The assembler output file name is made by replacing ".c" with ".s" at the end of the input file name.  Do nothing at all for assembler source files or object files specified as input.
  254. Run only the C preprocessor. Preprocess all the C source files specified and output the results to standard output.
  255. Compiler driver program prints the commands it executes as it runs the preprocessor, compiler proper, assembler and linker. Some of these are directed to print their own version numbers.
  256. The executable is stripped from the DRI compatible or extended symbol table. Certain symbolic debuggers like "sid.prg" work with this symbol table. Also the programs "printstk.ttp" and "fixstk.ttp" (See 
  257. The Utilities
  258.  for more info) lookup the symbol "_stksize in this table.
  259. This option directs the linker to discard all local labels while creating the symbol table and write only those labels, which are marked global.
  260. Instead of the standard DRI compatible symbol table, an extended symbol table is written, which allows symbol names to be up to 22 characters long. Most of the utility programs have been updated to work with this format. The most benefit you get with "gprof.ttp" and "adb" (the adb-like debugger, originally written for the Sozobon C compiler by Johann Rueg and Don Dugger and later improved by Michal Jaegermann (See 
  261. Debugging
  262.  for additional info about debugging)).
  263. -B {prefix}
  264. The compiler driver program tries {prefix} as a prefix for each program it tries to run. These programs are "gcc-cpp.ttp", "gcc-cc1.ttp", "gcc-as.ttp" and "gcc-ld.ttp".
  265. For each subprogram to be run, the compiler driver first tries the "-B" prefix, if any. If that name is not found, or if "-B" was not specified, the driver tries two standard prefixes, which are "/usr/lib/gcc-" and "/usr/local/lib/gcc-". If neither of those results in a file name that is found, the unmodified program name is searched for using the directories specified in your "PATH" environment variable.
  266. You can get a similar result from the environment variable "GCCEXEC". If it is defined, its value is used as a prefix in the same way. If both the "-B" option and the "GCCEXEC" variable are present, the "-B" option is used first and the environment variable value second.
  267. This option directs all output from "stderr" to the file "compile.err". So, all error messages and warnings, which are printed during a compile run are written to this file. The redirection is done by the compiler driver and is therefore only valid for those programs, which are subsequently invoked by "gcc.ttp". The "-z" option was introduced only very lately, so not every executable floating around might have it.
  268.   These options control the details of C compilation itself.
  269. -ansi
  270. Support all ANSI standard C programs.
  271. This turns off certain features of GNU C that are incompatible with ANSI C, such as the "asm", "inline" and "typeof" keywords, and predefined macros such as "unix" and "vax" that identify the type of system you are using. It also enables the undesirable and rarely used ANSI trigraph feature.
  272. The "-ansi" option does not cause non-ANSI programs to be rejected gratuitously. For that, "-pedantic" is required in addition to "-ansi".
  273. The macro "__STRICT_ANSI__" is predefined when the "-ansi" option is used.  Some header files may notice this macro and refrain from declaring certain functions or defining certain macros that the ANSI standard doesn't call for; this is to avoid interfering with any programs that might use these names for other things.
  274. -traditional
  275. Attempt to support some aspects of traditional C compilers. Specifically:
  276. - All "extern" declarations take effect globally even if they are written inside of a function definition.  This includes implicit declarations of functions.
  277. - The keywords "typeof", "inline", "signed", "const" and "volatile" are not recognized.
  278. - Comparisons between pointers and integers are always allowed.
  279. - Integer types "unsigned short" and "unsigned char" promote to "unsigned int".
  280. - Out-of-range floating point literals are not an error.
  281. - All automatic variables not declared "register" are preserved by "longjmp". Ordinarily, GNU C follows ANSI C: automatic variables not declared "volatile" may be clobbered.
  282. - In the preprocessor, comments convert to nothing at all, rather than to a space. This allows traditional token concatenation.
  283. - In the preprocessor, macro arguments are recognized within string constants in a macro definition (and their values are stringified, though without additional quote marks, when they appear in such a context). The preprocessor always considers a string constant to end at a newline.
  284. - The predefined macro "__STDC__" is not defined when you use "-traditional", but "__GNUC__" is (since the GNU extensions which "__GNUC__" indicates are not affected by "-traditional").  If you need to write header files that work differently depending on whether "-traditional" is in use, by testing both of these predefined macros you can distinguish four situations: GNU C, traditional GNU C, other ANSI C compilers, and other old C compilers.
  285. Optimize. Optimizing compilation takes somewhat more time, and a lot more memory for a large function. Without "-O", the compiler's goal is to reduce the cost of compilation and to make debugging produce the expected results. Statements are independent: if you stop the program with a breakpoint between statements, you can then assign a new value to any variable or change the program counter to any other statement in the function and get exactly the results you would expect from the source code.
  286. Without "-O", only variables declared "register" are allocated in registers. The resulting compiled code is a little worse than produced by PCC without "-O".
  287. With "-O", the compiler tries to reduce code size and execution time.Some of the "-f" options described below turn specific kinds of optimization on or off.
  288. Produce debugging information in the operating system's native format (for DBX or SDB). GCC on the Atari produces the DBX debugging format. GDB also works with this debugging information.
  289. Unlike most other C compilers, GNU CC allows you to use "-g" with "-O". The shortcuts taken by optimized code may occasionally produce surprising results: some variables you declared may not exist at all; flow of control may briefly move where you did not expect it; some statements may not be executed because they compute constant results or their values were already at hand; some statements may execute in different places because they were moved out of loops. Nevertheless it proves possible to debug optimized output. This makes it reasonable to use the optimizer for programs that might have bugs.
  290. Produce debugging information in GDB's own format. This option is no longer supported. Do not use it.
  291. Inhibit all warning messages.
  292. Print extra warning messages for these events:
  293. - An automatic variable is used without first being initialized.
  294. These warnings are possible only in optimizing compilation, because they require data flow information that is computed only when optimizing.  They occur only for variables that are candidates for register allocation.  Therefore, they do not occur for a variable that is declared "volatile", or whose address is taken, or whose size is other than 1, 2, 4 or 8 bytes.  Also, they do not occur for structures, unions or arrays, even when they are in registers.
  295. Note that there may be no warning about a variable that is used only to compute a value that itself is never used, because such computations may be deleted by the flow analysis pass before the warnings are printed.
  296. These warnings are made optional because GNU CC is not smart enough to see all the reasons why the code might be correct despite appearing to have an error.  Here is one example of how this can happen:
  297.   int x;
  298.   switch (y)
  299.     {
  300.     case 1: x = 1;
  301.       break;
  302.     case 2: x = 4;
  303.       break;
  304.     case 3: x = 5;
  305.     }
  306.   foo (x);
  307. If the value of "y" is always 1, 2 or 3, then "x" is always initialized, but GNU CC doesn't know this.  Here is another common case:
  308.   int save_y;
  309.   if (change_y) save_y = y, y = new_y;
  310.  .........
  311.   if (change_y) y = save_y;
  312. This has no bug because "save_y" is used only if it is set.
  313. Some spurious warnings can be avoided if you declare as "volatile" all the functions you use that never return.
  314. - A nonvolatile automatic variable might be changed by a call to "longjmp".  These warnings as well are possible only in optimizing compilation.
  315. - The compiler sees only the calls to "setjmp".  It cannot know where "longjmp" will be called; in fact, a signal handler could call it at any point in the code.  As a result, you may get a warning even when there is in fact no problem because "longjmp" cannot in fact be called at the place which would cause a problem.
  316. - A function can return either with or without a value.  (Falling off the end of the function body is considered returning without a value.)  For example, this function would inspire such a warning:
  317. foo (a)
  318.   if (a > 0)
  319.     return a;
  320. Spurious warnings can occur because GNU CC does not realize that certain functions (including "abort" and "longjmp") will never return.
  321. - An expression-statement contains no side effects.
  322. In the future, other useful warnings may also be enabled by this option.
  323. -Wimplicit
  324. Warn whenever a function is implicitly declared.
  325. -Wreturn-type
  326. Warn whenever a function is defined with a return-type that defaults to "int".  Also warn about any "return" statement with no return-value in a function whose return-type is not "void".
  327. -Wunused
  328. Warn whenever a local variable is unused aside from its declaration, and whenever a function is declared static but never defined.
  329. -Wswitch
  330. Warn whenever a "switch" statement has an index of enumeral type and lacks a "case" for one or more of the named codes of that enumeration.  (The presence of a "default" label prevents this warning.)   "case" labels outside the enumeration range also provoke warnings when this option is used.
  331. -Wcomment
  332. Warn whenever a comment-start sequence "/*" appears in a comment.
  333. -Wtrigraphs
  334. Warn if any trigraphs are encountered (assuming they are enabled).
  335. -Wall
  336. All of the above "-W" options combined.  These are all the options which pertain to usage that we recommend avoiding and that we believe is easy to avoid, even in conjunction with macros.
  337. The other "-W...." options below are not implied by "-Wall" because certain kinds of useful macros are almost impossible to write without causing those warnings.
  338. -Wshadow
  339. Warn whenever a local variable shadows another local variable.
  340. -Wid-clash-{len}
  341. Warn whenever two distinct identifiers match in the first {len} characters.  This may help you prepare a program that will compile with certain obsolete, brain-damaged compilers.
  342. -Wpointer-arith
  343. Warn about anything that depends on the "size of" a function type or of "void".  GNU C assigns these types a size of 1, for convenience in calculations with "void *" pointers and pointers to functions.
  344. -Wcast-qual
  345. Warn whenever a pointer is cast so as to remove a type qualifier from the target type.  For example, warn if a "const char *" is cast to an ordinary "char *".
  346. -Wwrite-strings
  347. Give string constants the type "const char[{length}]" so that copying the address of one into a "non-const char *" pointer will get a warning.  These warnings will help you find at compile time code that can try to write into a string constant, but only if you have been very careful about using "const" in declarations and prototypes.  Otherwise, it will just be a nuisance; this is why we did not make "-Wall" request these warnings.
  348. Generate extra code to write profile information suitable for the analysis program "prof". This is useless on the Atari ST. Use "-pg" instead.
  349. Generate extra code to write profile information suitable for the analysis program "gprof".
  350. -l{library}
  351. Search a standard list of directories for a library named {library}, which is actually a file named "$GNULIB\{library}.olb". The linker uses this file as if it had been specified precisely by name.
  352. The directories searched include several standard system directories plus any that you specify with "-L".
  353. Normally the files found this way are library files---archive files whose members are object files.  The linker handles an archive file by scanning through it for members which define symbols that have so far been referenced but not defined.  But if the file that is found is an ordinary object file, it is linked in the usual fashion.  The only difference between using an "-l" option and specifying a file name is that "-l" searches several directories.
  354. -L{dir}
  355. Add directory {dir} to the list of directories to be searched for {-l}.
  356. -nostdlib
  357. Don't use the standard system libraries and startup files when linking. Only the files you specify (plus "gnulib") will be passed to the linker.
  358. -m{machinespec}
  359. Machine-dependent option specifying something about the type of target machine. These options are defined by the macro "TARGET_SWITCHES" in the machine description. The default for the options is also defined by that macro, which enables you to change the defaults.
  360. These are the "-m" options defined in the 68000 machine description:
  361. -m68000
  362. -mc68000
  363. Generate output for a 68000. This is the default on the Atari ST.
  364. -m68020
  365. -mc68020
  366. Generate output for a 68020 (rather than a 68000).
  367. -m68881
  368. Generate output containing 68881 instructions for floating point.
  369. -msoft-float
  370. Generate output containing library calls for floating point.
  371. -mshort
  372. Consider type "int" to be 16 bits wide, like "short int" and causes the macro "__MSHORT__" to be defined. Using this option also causes the library "{library}16.olb" to be linked. (Also 
  373. Predefined Macros
  374.  for more info)
  375. -mint
  376. Compile for MiNT (MiNT is not TOS). The macro "__MINT__" is defined and the linker links with the mint library "-lmint"  before linking with the normal C library "-lgnu". Also, the linker uses the startup file "mcrt0.o" instead of the normal "crt0.o". If "-mshort" is also specified, then both the macros "__MSHORT__"  and "__MINT__" are defined and the linker links with "-lmint16 -lgnu16".
  377. -mnobitfield
  378. Do not use the bit-field instructions.  "-m68000 implies "-mnobitfield".
  379. -mbitfield
  380. Do use the bit-field instructions.  "-m68020" implies "-mbitfield".  This is the default if you use the unmodified sources.
  381. -mrtd
  382. Use a different function-calling convention, in which functions that take a fixed number of arguments return with the "rtd" instruction, which pops their arguments while returning. This saves one instruction in the caller since there is no need to pop the arguments there.
  383. This calling convention is incompatible with the one normally used on U**x, so you cannot use it if you need to call libraries compiled with the U**x compiler.
  384. Also, you must provide function prototypes for all functions that take variable numbers of arguments (including "printf"); otherwise incorrect code will be generated for calls to those functions.
  385. In addition, seriously incorrect code will result if you call a function with too many arguments.  (Normally, extra arguments are harmlessly ignored.)
  386. The "rtd" instruction is supported by the 68010 and 68020 processors, but not by the 68000.
  387. -f{flag}
  388. Specify machine-independent flags.  Most flags have both positive and negative forms; the negative form of "-ffoo" would be "-fno-foo".  In the table below, only one of the forms is listed---the one which is not the default.  You can figure out the other form by either removing "no-" or adding it.
  389. -ffloat-store
  390. Do not store floating-point variables in registers.  This prevents undesirable excess precision on machines such as the 68000 where the floating registers (of the 68881) keep more precision than a "double" is supposed to have.
  391. For most programs, the excess precision does only good, but a few programs rely on the precise definition of IEEE floating point.  Use "-ffloat-store" for such programs.
  392. -fno-asm
  393. Do not recognize "asm", "inline" or "typeof" as a keyword.  These words may then be used as identifiers.
  394. -fno-defer-pop
  395. Always pop the arguments to each function call as soon as that function returns.  Normally the compiler (when optimizing) lets arguments accumulate on the stack for several function calls and pops them all at once.
  396. -fstrength-reduce
  397. Perform the optimizations of loop strength reduction and elimination of iteration variables.
  398. -fcombine-regs
  399. Allow the combine pass to combine an instruction that copies one register into another. This might or might not produce better code when used in addition to "-O". I am interested in hearing about the difference this makes. (Only GCC and G++ 1.40).
  400. -fforce-mem
  401. Force memory operands to be copied into registers before doing arithmetic on them.  This may produce better code by making all memory references potential common subexpressions.  When they are not common subexpressions, instruction combination should eliminate the separate register-load.  I am interested in hearing about the difference this makes.
  402. -fforce-addr
  403. Force memory address constants to be copied into registers before doing arithmetic on them. This may produce better code just as "-fforce-mem" may.
  404. -fomit-frame-pointer
  405. Don't keep the frame pointer in a register for functions that don't need one.  This avoids the instructions to save, set up and restore frame pointers; it also makes an extra register available in many functions.  
  406. It also makes debugging impossible.
  407. On some machines, such as the Vax, this flag has no effect, because the standard calling sequence automatically handles the frame pointer and nothing is saved by pretending it doesn't exist.  The machine-description macro "FRAME_POINTER_REQUIRED" controls whether a target machine supports this flag.
  408. -finline-functions
  409. Integrate all simple functions into their callers. The compiler heuristically decides which functions are simple enough to be worth integrating in this way.
  410. If all calls to a given function are integrated, and the function is declared "static", then the function is normally not output as assembler code in its own right.
  411. -fcaller-saves
  412. Enable values to be allocated in registers that will be clobbered by function calls, by emitting extra instructions to save and restore the registers around such calls.  Such allocation is done only when it seems to result in better code than would otherwise be produced.
  413. This option is enabled by default on certain machines, usually those which have no call-preserved registers to use instead.
  414. -fkeep-inline-functions
  415. Even if all calls to a given function are integrated, and the function is declared "static", nevertheless output a separate run-time callable version of the function.
  416. -fwritable-strings
  417. Store string constants in the writable data segment and don't uniquize them.  This is for compatibility with old programs which assume they can write into string constants. Writing into string constants is a very bad idea; "constants" should be constant.
  418. -fcond-mismatch
  419. Allow conditional expressions with mismatched types in the second and third arguments. The value of such an expression is void.
  420. -fno-function-cse
  421. Do not put function addresses in registers; make each instruction that calls a constant function contain the function's address explicitly.
  422. This option results in less efficient code, but some strange hacks that alter the assembler output may be confused by the optimizations performed when this option is not used.
  423. -fvolatile
  424. Consider all memory references through pointers to be volatile.
  425. -fshared-data
  426. Requests that the data and non-"const" variables of this compilation be shared data rather than private data.  The distinction makes sense only on certain operating systems, where shared data is shared between processes running the same program, while private data exists in one copy per process.
  427. -funsigned-char
  428. Let the type "char" be the unsigned, like "unsigned char".
  429. Each kind of machine has a default for what "char" should be. It is either like "unsigned char" by default or like "signed char" by default.  (Actually, at present, the default is always signed.)
  430. The type "char" is always a distinct type from either "signed char" or "unsigned char", even though its behavior is always just like one of those two.
  431. Note that this is equivalent to "-fno-signed-char", which is the negative form of "-fsigned-char".
  432. -fsigned-char
  433. Let the type "char" be signed, like "signed char".
  434. Note that this is equivalent to "-fno-unsigned-char", which is the negative form of "-funsigned-char".
  435. -ffixed-{reg}
  436. Treat the register named {reg} as a fixed register; generated code should never refer to it (except perhaps as a stack pointer, frame pointer or in some other fixed role).
  437. {reg} must be the name of a register. The register names accepted are machine-specific and are defined in the "REGISTER_NAMES" macro in the machine description macro file.
  438. This flag does not have a negative form, because it specifies a three-way choice.
  439. -fcall-used-{reg}
  440. Treat the register named {reg} as an allocatable register that is clobbered by function calls.  It may be allocated for temporaries or variables that do not live across a call. Functions compiled this way will not save and restore the register {reg}.
  441. Use of this flag for a register that has a fixed pervasive role in the machine's execution model, such as the stack pointer or frame pointer, will produce disastrous results.
  442. This flag does not have a negative form, because it specifies a three-way choice.
  443. -fcall-saved-{reg}
  444. Treat the register named {reg} as an allocatable register saved by functions. It may be allocated even for temporaries or variables that live across a call. Functions compiled this way will save and restore the register{reg} if they use it.
  445. Use of this flag for a register that has a fixed pervasive role in the machine's execution model, such as the stack pointer or frame pointer, will produce disastrous results.
  446. A different sort of disaster will result from the use of this flag for a register in which function values may be returned.
  447. This flag does not have a negative form, because it specifies a three-way choice.
  448. -pedantic
  449. Issue all the warnings demanded by strict ANSI standard C; reject all programs that use forbidden extensions.
  450. Valid ANSI standard C programs should compile properly with or without this option (though a rare few will require "-ansi"). However, without this option, certain GNU extensions and traditional C features are supported as well. With this option, they are rejected. There is no reason to 
  451.  this option; it exists only to satisfy pedants.
  452. These options control the C preprocessor, which is run on each C source file before actual compilation. If you use the "-E" option, nothing is done except C preprocessing. Some of these options make sense only together with "-E" because they request preprocessor output that is not suitable for actual compilation.
  453. Tell the preprocessor not to discard comments. Used with the "-E" option.
  454. -I{dir}
  455. Search directory {dir} for include files.
  456. Any directories specified with "-I" options before the "-I-" option are searched only for the case of "#include "{file}""; they are not searched for "#include <{file}>".
  457. If additional directories are specified with "-I" options after the "-I-", these directories are searched for all "#include" directives. (Ordinarily 
  458.  "-I" directories are used this way.)
  459. In addition, the "-I-" option inhibits the use of the current directory as the first search directory for "#include "{file}"". Therefore, the current directory is searched only if it is requested explicitly with "-I.". Specifying both "-I-" and "-I." allows you to control precisely which directories are searched before the current one and which are searched after.
  460. -nostdinc
  461. Do not search the standard system directories for header files.  Only the directories you have specified with "-I" options (and the current directory, if appropriate) are searched.
  462. Between "-nostdinc" and "-I-", you can eliminate all directories from the search path except those you specify.
  463. Tell the preprocessor to output a rule suitable for "make" describing the dependencies of each source file.  For each source file, the preprocessor outputs one "make"-rule whose target is the object file name for that source file and whose dependencies are all the files "#include"d in it. This rule may be a single line or may be continued with "\"-newline if it is long.
  464. "-M" implies "-E".
  465. Like "-M" but the output mentions only the user-header filesincluded with "#include "{file}"". System header files included with "#include <@var{file}>" are omitted.
  466. "-MM" implies "-E".
  467. -D{macro}
  468. Define macro {macro} with the empty string as its definition.
  469. -D{macro}={defn}
  470. Define macro {macro} as {defn}.
  471. -U{macro}
  472. Undefine macro {macro}.
  473. Support ANSI C trigraphs. You don't want to know about this brain-damage. The "-ansi" option also has this effect.
  474. Controlling the C++-Compiler Driver (g++.ttp)
  475.   The GNU C++ compiler uses a command syntax much like the AT&T C++ compiler. The "g++.ttp" program accepts options and file names as operands.  Multiple single-letter options may 
  476.  be grouped: "-dr" is very different from "-d -r".
  477. When you invoke GNU C++, it normally does preprocessing, compilation, assembly and linking.  File names which end in ".c", ".cc", or ".C" are taken as GNU C++ source to be preprocessed and compiled; compiler output files plus any input files with names ending in ".s" are assembled; then the resulting object files, plus any other input files, are linked together to produce an executable.
  478. Unlike C++, there is no "-F" option.  This is because GNU C++ is a native-code C++ compiler, not a front-end pre-processor.  The advantages of this organization are faster compilation speed, better error-reporting capabilities, better opportunity for compiler optimization, and true source-level debuggability with the GDB debugger (version 3.4 or higher).
  479. Command options allow you to stop this process at an intermediate stage. For example, the "-c" option says not to run the linker.  Then the output consists of object files output by the assembler.
  480. Other command options are passed on to one stage.  Some options control the preprocessor and others the compiler itself.  Yet other options control the assembler and linker; these are not documented here because the GNU assembler and linker are not yet released.
  481. Here are the options to control the overall compilation process, including those that say whether to link, whether to assemble, and so on. The options, which don't have any text, behave exactly as their GCC counterparts. 
  482. With GCC 2.x there is no independend compiler driver for C++.  "gcc.ttp" handles both cases. One major difference between "g++.ttp" from version 1.xx and "gcc.ttp" from version 2.x is, that you have to explicitly link with "g++.olb". Therefore when you compile C++ programs with GCC 2.x you alway have to include "-lg++" on the command line, when you create the final executable.
  483. -o {file}
  484. It is intended that the compiler driver of GNU C++ will invoke the appropriate translator (or series of translators) for a given source file.  Currently, the translators are selected on the basis of their file
  485. extension.  So that one driver can be used for many different translators, it is important that these extensions be distinct.  It is strongly suggested that users become accustomed to using a ".cc" file extension for GNU C++ code, to distinguish it from the ".c" file extension already used for GNU CC code.
  486. These options control the details of GNU C++ compilation itself.
  487. -ansi
  488. With this option enabled, differences between GNU C++ and AT&T C++ are also flagged.  Because the C++ language definition and the ANSI draft differ on the interpretation of syntactically identical constructs, it is unlikely that this flag could possibly be of any real use.  (For this reason, this flag is currently not fully implemented).
  489. -traditional
  490. The other aspects of "-traditional" are equivalent to GCC.
  491. The predefined macro "__cplusplus" is defined to identify compilation for C++ 2.0.  C++ version 1.2 uses "c_plusplus" as its identifying macro.  Since GNU C++ implements version 2.0 semantics, the former is defined, while the latter is not.  The macro "__GNUG__" is also defined, so that features specific to GNU C++ can be used conditionally.
  492. -Wimplicit
  493. -Wreturn-type
  494. -Wunused
  495. -Wswitch
  496. -Wcomment
  497. -Wtrigraphs
  498. -Wall
  499. -Wshadow
  500. -Wid-clash-{len}
  501. -Wpointer-arith
  502. -Wcast-qual
  503. -Wwrite-strings
  504. -l{library}
  505. -L{dir}
  506. -nostdlib
  507. -m{machinespec}
  508. -m68020
  509. -mc68020
  510. -m68000
  511. -mc68000
  512. -m68881
  513. -msoft-float
  514. -mshort
  515. -mint
  516. -mnobitfield
  517. -mbitfield
  518. -mrtd
  519. -f{flag}
  520. m -ffloat-store
  521. -fno-asm
  522. -fno-defer-pop
  523. -fstrength-reduce
  524. -fcombine-regs
  525. -fforce-mem
  526. -fforce-addr
  527. -fomit-frame-pointer
  528. -finline-functions
  529. -fdefault-inline
  530. If this option is enabled then member functions defined inside class scope are compiled inline by default, 
  531. , you don't need to add "inline" in front of the member function name.  By popular demand, this option is now the default.  To keep GNU C++ from inlining these member functions, specify "-fno-default-inline".
  532. -fcaller-saves
  533. -fkeep-inline-functions
  534. -fwritable-strings
  535. -fcond-mismatch
  536. -fno-function-cse
  537. -fvolatile
  538. -fshared-data
  539. -funsigned-char
  540. -fsigned-char
  541. -ffixed-{reg}
  542. -fcall-used-{reg}
  543. -fcall-saved-{reg}
  544. -fstrict-prototype
  545. Consider the declaration "int foo ();".  In C++, this means that the function "foo" takes no arguments.  In ANSI C, this is declared "int foo(void);".  With the flag "-fno-strict-prototype", declaring functions with no arguments is equivalent to declaring its argument list to be untyped, i.e., "int foo ();" is equivalent to
  546. saying "int foo (...);".
  547. -felide-constructors
  548. Using this option instructs the compiler to be smarter about when it can elide constructors.  With out this flag, GNU C++ and cfront both generate effectively the same code for example:
  549. A foo ();
  550. A x (foo ());   // x is initialized by `foo ()', no ctor called here
  551. A y = foo ();   // call to `foo ()' heads to temporary,
  552.                 // y is initialized from the temporary.
  553. Note the difference!  With this flag, GNU C++ initializes `y' directly from the call to `foo ()' without going through a temporary.
  554. -fall-virtual
  555. When the "-fall-virtual" option is used, all member functions (except for constructor functions and new/delete member operators) declared in the same class with a "method-call" operator method have
  556. entries made for them in the vtable for the given class.  In effect, all of these methods become "implicitly virtual."
  557. This does 
  558.  mean that all calls to these methods will be made through the vtable.  There are some circumstances under which it is obvious that a call to a given virtual function can be made directly, and in these cases the calls still go direct.
  559. The effect of making all methods of a class with a declared `operator->()()' implicitly virtual using "-fall-virtual" extends also to all non-constructor methods of any class derived from such a class.
  560. -fthis-is-variable
  561. The incorporation of user-defined free store management into C++ has made assignment to "this" an anachronism.  Therefore, by default GNU C++ treats the type of "this" in a member function of "class X" "X *const".  In other words, it is illegal to assign to "this" within a class member function.  However, for backwards compatibility, you can invoke the old behavior by using "-fthis-is-variable".
  562. -fsave-memoized
  563. -fmemoize-lookups
  564. These flags are of use to get the compiler to compile programs faster using heuristics.  They are not on by default since they only do so about half the time.  They other half of the time programs compile more slowly (and take more memory).
  565. The first time the compiler must build a call to a member function (or reference to a data member), it must (1) determine whether the class implements member functions of that name (2) resolve which member function to call (which involves figuring out what sorts of type conversions need to be made), and (3) check the visibility of the member function to the caller.  All of this adds up to slower compilation. Normally, the second time a call is made to that member function (or reference to that data member), it must go through the same lengthy process again.  This means that code like this
  566.   cout << "This " << p << " has " << n << " legs.\n";
  567. makes six passes through all three steps.  By using a software cache, a "hit" significantly reduces this cost.  Unfortunately, using the cache introduces another layer of mechanisms which must be implemented, and so incurrs its own overhead.  The "-fmemoize-lookups" enables the software cache.
  568. Because access privileges (visibility) to members and member functions may differ from one function context to the next, may need to be flushed.  With the "-fmemoize-lookups" flag, the cache is flushed after every function that is compiled.  With the "-fsave-memoized"  flag, when the compiler determines that the context of the last function compiled would yield the same access privileges of the next function to compile, it preserves the cache.  This really helps when defining many member functions for the same class: with the exception of member functions which are friends of other classes, each member function has exactly the same access privileges as every other, and the cache need not be flushed.
  569. -pedantic
  570. Attempt to support strict ANSI standard C.  Since C++ invalidates a number of ANSI constructions, this switch is of dubious value.  Some attempt has been made to warn about non-standard C++ features, however, even this is of uncertain value, as there are two C++ standards currently in existence: the standard as documented by AT&T, and the standard as implemented by the AT&T C++ compiler.  Valid C++ programs should compile properly with or without this switch.  However, without this switch, certain useful or traditional constructs banned by the standard are supported.  With this switch, they are rejected.  There is no reason to use this switch; it exists only to satisfy curious pedants.
  571. The options, which control the behaviour of the C preprocessor are the same as for GCC (See 
  572. The C-Compiler Driver
  573. , last section).
  574. The Preprocessor
  575. Most often when you use the C preprocessor you will not have to invoke it explicitly: the C compiler will do so automatically. However, the preprocessor is sometimes useful individually.
  576. Invoking the C Preprocessor
  577. The C preprocessor expects two file names as arguments, "infile" and "outfile". The preprocessor reads "infile" together with any other files it specifies with "#include".  All the output generated by the combined input files is written in "outfile".
  578. Either "infile" or "outfile" may be "-", which as "infile" means to read from standard input and as "outfile" means to write to standard output.  Also, if "outfile" or both file names are omitted, the standard output and standard input are used for the omitted file names.
  579. Here is a table of command options accepted by the C preprocessor.  Most of them can also be given when compiling a C program; they are passed along automatically to the preprocessor when it is invoked by the compiler.
  580. Inhibit generation of "#"-lines with line-number information in the output from the preprocessor. This might be useful when running the preprocessor on something that is not C code and will be sent to a program which might be confused by the "#"-lines
  581. Do not discard comments: pass them through to the output file. Comments appearing in arguments of a macro call will be copied to the output before the expansion of the macro call.
  582. Process ANSI standard trigraph sequences.  These are three-character sequences, all starting with "??", that are defined by ANSI C to stand for single characters.  For example, "??/" stands for "\", so "'??/n'" is a character constant for Newline. Strictly speaking, the GNU C preprocessor does not support all programs in ANSI Standard C unless "-T" is used, but if you ever notice the difference it will be with relief.
  583. You don't want to know any more about trigraphs.
  584. -pedantic
  585. Issue warnings required by the ANSI C standard in certain cases such as when text other than a comment follows "#else" or "#endif".
  586. -I {directory}
  587. Add the directory {directory} to the end of the list of directories to be searched for header files.  This can be used to override a system header file, substituting your own version, since these directories are searched before the system header file directories.  If you use more than one "-I" option, the directories are scanned in left-to-right order; the standard system directories come after.
  588. Any directories specified with "-I" options before the "-I-" option are searched only for the case of "#include "{file}""; they are not searched for "#include <{file}>".
  589. If additional directories are specified with "-I" options after the "-I-", these directories are searched for all "#include" directives.
  590. In addition, the "-I-" option inhibits the use of the current directory as the first search directory for "#include "{file}"".  Therefore, the current directory is searched only if it is requested explicitly with "-I.".  Specifying both "-I-" and "-I." allows you to control precisely which directories are searched before the current one and which are searched after.
  591. -nostdinc
  592. Do not search the standard system directories for header files.  Only the directories you have specified with "-I" options (and the current directory, if appropriate) are searched.
  593. -D {name}
  594. Predefine {name} as a macro, with definition "1".
  595. -D {name}={definition}
  596. Predefine {name} as a macro, with definition{definition}.  There are no restrictions on the contents of {definition}, but if you are invoking the preprocessor from a shell or shell-like program you may need to use the shell's quoting syntax to protect characters such as spaces that have a meaning in the shell syntax.
  597. -U {name}
  598. Do not predefine {name}. If both "-U" and "-D" are specified for one name, the "-U" beats the "-D" and the name is not predefined.
  599. -undef
  600. Do not predefine any nonstandard macros.
  601. Instead of outputting the result of preprocessing, output a list of "#define" commands for all the macros defined during the execution of the preprocessor.
  602. Instead of outputting the result of preprocessing, output a rule suitable for "make" describing the dependencies of the main source file.  The preprocessor outputs one "make" rule containing the object file name for that source file, a colon, and the names of all the included files.  If there are many included files then the rule is split into several lines using "\"-newline.
  603. This feature is used in automatic updating of makefiles.
  604. Like "-M" but mention only the files included with "#include "{file}"".  System header files included with "#include <{file}>" are omitted.
  605. -i {file}
  606. Process {file} as input, discarding the resulting output, before processing the regular input file.  Because the output generated from {file} is discarded, the only effect of "-i {file}" is to make the macros defined in {file} available for use in the main input.
  607. Predefined Macros
  608. The standard predefined macros are available with the same meanings regardless of the machine or operating system on which you are using GNU C.  Their names all start and end with double underscores.  Those preceding "__GNUC__" in this table are standardized by ANSI C; the rest are GNU C extensions.
  609. __FILE__
  610. This macro expands to the name of the current input file, in the form of a C string constant.
  611. __LINE__
  612. This macro expands to the current input line number, in the form of a decimal integer constant.  While we call it a predefined macro, it's a pretty strange macro, since its "definition" changes with each new line of source code.
  613. This and "__FILE__" are useful in generating an error message to report an inconsistency detected by the program; the message can state the source line at which the inconsistency was detected. For example,
  614. fprintf (stderr, 
  615.      "Internal error: negative string length "
  616.          "%d at %s, line %d.",
  617.          length, __FILE__, __LINE__);
  618. A "#include" command changes the expansions of "__FILE__" and "__LINE__" to correspond to the included file.  At the end of that file, when processing resumes on the input file that contained the "#include" command, the expansions of "__FILE__" and "__LINE__" revert to the values they had before the "#include" (but "__LINE__" is then incremented by one as processing moves to the line after the "#include").
  619. The expansions of both "__FILE__" and "__LINE__" are altered if a "#line" command is used.
  620. __DATE__
  621. This macro expands to a string constant that describes the date on which the preprocessor is being run.  The string constant contains eleven characters and looks like "Jan 29 1987" or "Apr 1 1905".
  622. __TIME__
  623. This macro expands to a string constant that describes the time at which the preprocessor is being run.  The string constant contains eight characters and looks like "23:59:01".
  624. __STDC__
  625. This macro expands to the constant 1, to signify that this is ANSI Standard C. (Whether that is actually true depends on what C compiler will operate on the output from the preprocessor.)
  626. __GNUC__
  627. This macro is defined if and only if this is GNU C.  This macro is defined only when the entire GNU C compiler is in use; if you invoke the preprocessor directly, "__GNUC__" is undefined.
  628. __STRICT_ANSI__
  629. This macro is defined if and only if the "-ansi" switch was specified when GNU C was invoked.  Its definition is the null string. This macro exists primarily to direct certain GNU header files not to define certain traditional U**x constructs which are incompatible with ANSI C.
  630. __VERSION__
  631. This macro expands to a string which describes the version number of GNU C.  The string is normally a sequence of decimal numbers separated by periods, such as "1.18".  The only reasonable use of this macro is to incorporate it into a string constant.
  632.  __OPTIMIZE__
  633. This macro is defined in optimizing compilations.  It causes certain GNU header files to define alternative macro definitions for some system library functions.  It is unwise to refer to or test the definition of this macro unless you make very sure that programs will execute with the same effect regardless.
  634. __CHAR_UNSIGNED__
  635. This macro is defined if and only if the data type "char" is unsigned on the target machine. It exists to cause the standard header file "limit.h" to work correctly.  It is bad practice to refer to this macro yourself; instead, refer to the standard macros defined in "limit.h".
  636. __MSHORT__
  637. This macro is defined, if "gcc.ttp" is invoked with the "-mshort" option, which causes integers to be 16 bit. Please carefully examine the prototypes in the "#include <>" headers for types before using "-mshort".
  638. __MINT__
  639. This macros is defined, if "gcc.ttp" is invoked with the "-mint" option. This macros activates some portions of the header files, which are MiNT specific. Up to version 8 of the MiNT libraries and headers the header files of J.R.Bammi's libraries are compatible with the ones from Eric Smith's library. Therefore if you were writing programs for MiNT you could stick to Bammi's headers and use the "-mint" option. I don't know, if header files are still compatible with version 10 of the MiNT libraries.
  640. Apart from the above listed macros, there are usually some more to indicate what type of system and machine is in use. For example "unix" is normally defined on all U**x systems. Other macros describe more or less the type of CPU the system runs on. GNU CC for the Atari ST has the following macros predefined.
  641. atarist
  642. Please keep in mind, that these macros are only defined, if the preprocessor is invoked from the compiler driver "gcc.ttp".
  643. These predefined symbols are not only nonstandard, they are contrary to the ANSI standard because their names do not start with underscores.  However, the GNU C preprocessor would be useless if it did not predefine the same names that are normally predefined on the system and machine you are using.  Even system header files check the predefined names and will generate incorrect declarations if they do not find the names that are expected.
  644. The "-ansi" option which requests complete support for ANSI C inhibits the definition of these predefined symbols.
  645. Generating Dependency Information
  646.   The preprocessor has a not so well known feature, which lets you generate dependency information for makefiles and write these dependencies directly into a file. 
  647.   You already know about the options "-M" and "-MM" for the compiler driver and the preprocessor (See 
  648. The Preprocessor
  649.  for more info). 
  650. DEPENDENCIES_OUTPUT
  651. SUNPRO_DEPENDENCIES
  652. The GNU Assembler (GAS)
  653.   Most of the time you will be programming in C. But there may certain situations, where it is feasible to write in assembler. Time is usually a main reason to dive into assembler programming, when you have to squeeze the last redundant machine cycle out of your routine, to meet certain time limits. Another reason might be, that you have to do very low level stuff like fiddling with bits in the registers of a peripheral chip. An example for low level stuff is the startup module "crt0.o", which is written in assembler.
  654.   If you already have some experience in assembler programming, you might miss the feature of creating macros. This is not really a lack given the fact, that the assembler originated from an U**x environment.  Under this operating system there is a tools for nearly every purpose.  If you were in the need of an extensive macros facility, you would use the M4 macro processor. A GNU version of the M4 macro processor exists. It should be no problem to port it to the Atari with GCC. For some macro processing tasks you just as well use the C preprocessor. What I personally miss is the ability to produce a listing, but this will be fixed with GAS 1.92.
  655.   One command line option was introduced only very lately. The changes for the option "-m68040" were part of update 20, which Bammi released around end of April 1992. The assembler identifies itself, when invoked with the "-v" option with the string "GNU assembler version 1.38 atariST PatchLevel 2".
  656. Invoking the Assembler
  657. "gcc-as.ttp" supports the following command line options. The output is written to "a.out" by default.
  658. assembles the debugging information the C compiler included into the output. Without this flag the debugging information is otherwise discarded.
  659. Normally all labels, that start with a "L" are discarded and don't show up as symbols in the object code module. They are local to that assembler module. If the "-L" option is given, all local labels will be included in the object code module.
  660. keep externals to 2 bit offset.
  661. -m68000
  662. -m68010
  663. -m68020
  664. -m68040
  665. These options modify the behavior of assembler in respect of the used CPU. The M68020, for example, allows relative branches with 32-bit offset.
  666. -o{filename}
  667. writes the output to {filename} instead of{a.out}.
  668. The information, which normally would be assembled into the data section of the program, is moved into the text section.
  669. displays the version of the assembler.
  670. suppresses all warning messages.
  671. Syntax
  672. The assembler uses a slightly modified syntax from the one you might  know from other 68000 assemblers, which use the original Motorola syntax. The next sections trys to describe the syntax, GAS uses.
  673. The most obvious differences are the missing "." and the usage of the at sign ("@"). The original Motorola syntax uses the "." to separate the size modifier ("b", "w", "l") from the main instruction. In Motorola syntax one would write "move.l #1,d0" to move a long word with value 1 into register "d0". With GAS you simple write "movel #1,d0". The "@" is used to mark an indirection equivalent to the Motorola parentheses. To move a long word of value 1 to the location addressed by "a0", you have to write "movel #1,a0@". The equivalent instruction expressed in Motorola "move.l #1,(a0)". The "#" indicates immediate data in both cases.
  674. Register Names and Addressing Modes
  675. The register mnemonics are "d0..d7" for the data registers and "a0..a7" or "sp" for address register and the stack pointer.  "pc" is the program counter, "sr" the status register, "ccr" the condition code register and "usp" the user stack  pointer.
  676. The following table shows the operands GAS can parse. (The first part part describe the used abbreviations. The second part show the addressing modes with a equivalent C expression.)
  677. numb:
  678. a 8 bit number
  679. numw:
  680. a 16 bit number
  681. numl:
  682. a 32 bit number
  683. dreg:
  684. data register 0..7
  685. address or data register
  686. areg:
  687. address register 0..7
  688. address register or PC
  689. a 16 or 32 bit number
  690. num2:
  691. a 16 or 32 bit number
  692. "w" or "l"; if omitted, "l" is  assumed.
  693. scale:
  694. 1 2 4 or 8. If omitted, 1 is assumed.
  695. Addressing Modes
  696. Immediate Data
  697. #num                          --> NUM
  698. Data- or Address Register Direct
  699. dreg                          --> dreg
  700. areg                          --> areg
  701. Address Register Indirect
  702. areg@                        --> *(areg)
  703. Address Register Indirect with Postincrement or Predecrement
  704. areg@+                        --> *(areg++)
  705. areg@-                        --> *(--areg)
  706. Address Register (or PC) Indirect with Displacement
  707. apc@(numw)                    --> *(apc+numw) 
  708. Address Register (or PC) Indirect with Index (8-Bit Displacement) 
  709. (M68020 only)
  710. apc@(num,reg:sz:scale)        --> *(apc+num+reg*scale)
  711. apc@(reg:sz:scale)            --> same, with num=0
  712. Memory Indirect Postindexed 
  713. (M68020 only)
  714. apc@(num)@(num2,reg:sz:scale) --> *(*(apc+num)+num2+reg*scale)
  715. apc@(num)@(reg:sz:scale)      --> same, with num2=0
  716. apc@(num)@(num2)              --> *(*(apc+num)+num2)
  717.                                  (previous mode without an index reg)
  718. Memory Indirect Preindexed 
  719. (M68020 only)
  720. apc@(num,reg:sz:scale)@(num2) --> *(*(apc+num+reg*scale)+num2)
  721. apc@(reg:sz:scale)@(num2)     --> same, with num=0
  722. Absolute Address
  723. num:sz                        --> *(num)
  724. num                           --> *(num) (sz L assumed)
  725. Labels and Identifiers
  726. User defined identifiers are basically defined by the same rules as C identifier. They may contain the digits 0..9, the letters A..z and the underscore and must not start with a digit. Identifier, which end with a ":" are labels. A special form of labels starts with a "L" or consists of only a digit. Both types are local labels, which disappear, when the assembly is complete (unless the "-L" option was specified). They can't be used to resolve external references.  The "L" type label are referenced by their name, just as any other
  727. label. The digit type labels form a special kind of local labels. You might also call them temporary labels. They are especially useful when you have to create small loops, which poll a peripheral or fill a memory area. They are referenced by appending either a "f", for a forward reference, or a "b", for a backward reference, to the digit. Lets look at the following example, which is used to split a memory area starting at "0x80000". All data on an even addresses is copied to the area starting at "0x70000"; all data from odd addresses goes to the area starting at "0x78000".
  728. start:
  729.         lea     0x80000,a0
  730.         lea     0x70000,a1
  731.         lea     0x78000,a2
  732.         movel   #0x7fff,d5
  733. 0:                              | label "0" is defined
  734.         moveb   a0@+,a1@+
  735.         moveb   a0@+,a2@+
  736.         dbra    d5,0b           | reference of label "0"
  737.          ......
  738. The label "0" is referenced 3 lines later by "0b", since the reference is backward. You can use the label "0" again at a later time to construct more such loops. Since this temporary labels are restricted to one digit in length, you can only build constructs, which use 10 temporary labels at the same time.
  739. Comments
  740. The above example also shows, that comments start with a "|".  "#" is also used to mark a comments. The C compiler and the preprocessor generate lines, that start with a "#".
  741. Numerical and String Constants
  742. Numerical values are given the same way as in a C programs. By default number are taken to be decimal. A leading "0" denotes an octal and a "0x" a hexadecimal value. Floating point numbers start with a "0f". The optional exponent starts with a "e" or "E". 
  743. String constants are equivalent to C defined. They are enclosed in " " ". Some special character constants are defined by "\" and a following letter. These characters are possible:
  744. Backspace, Code 0x08
  745. Tab, Code 0x09
  746. Line Feed, Code 0x0a
  747. Form Feed, Code 0x0c
  748. Carriage Return, Code 0x0d
  749. Backslash itself
  750. Double Quote itself
  751. \{number}
  752. where {number} is a octal number with up to 3 digits specifying the character code.
  753. Assignments and Operators
  754. A "=" is used to assign a value to a Symbol.
  755. Lexp_frame = 8
  756. This is equivalent to the "equ" directive other assemblers use.
  757. GAS supports addition (+), subtraction (-), multiplication(*), division (/), right shift (>), left shift (<), and (&), or (|), not (!), xor (^) and modulo (%) in expressions. The order of precedence is
  758.           Rank    Examples
  759. lowest   0       operand, (expression)
  760.              1       + -
  761.              2       & ^ ! |
  762.              3       * / % < >
  763. Parentheses are used to coerce the order of evaluation.
  764. Segments, Location Counters and Labels
  765. A program written in assembler language may be broken into three different segments; the TEXT, DATA and BSS sections. Pseudo opcodes are used to switch between the sections. The assembler maintains a location counter for each segment. When a label is used in the assembler input, it is assigned the current value of the active location counter. The location counter is incremented with every byte, that the assembler outputs. GAS actually allows you to have more than one TEXT or DATA segment. This is so to ease code generation by high level compilers.  The assembler concatenates the different sections in the end to form continuous regions of TEXT and/or DATA. When you do assembly programming by hand you would stick to the pseudo opcodes ".text" or ".data", which use text or data segment with number 0 by default.
  766. Types
  767. Symbol and Labels can be of one of three type. A Symbol is 
  768. absolute
  769. ; when it's values is known at assembly time. A assignment like "Lexp_frame = 8" gives the symbol "Lexp_frame" the absolute value 8. A symbol or label, which contains an offset from the beginning of a section, is called "relocatable". The actual value of this symbol can only be determined after the linking process or when the program is running in memory. The third type of symbols are 
  770. undefined externals
  771. .  The actual value of this symbol is defined in an other program.
  772. When different types of symbols are combined to form expressions the following rules apply: ("abs" = absolute, "rel" = relocatable, "ext" = undefined external)
  773. abs + abs => abs
  774. abs + rel = rel + abs => rel
  775. abs + ext = ext + abs => ext
  776. abs - abs => abs
  777. rel - abs => rel
  778. ext - abs => ext
  779. rel - rel => abs
  780. (makes only sense, when both relocatable expression are relative to same segment)
  781. All other possible operators are only useful to form expressions with 
  782. absolute
  783.  values or symbols.
  784. Supported Pseudo Opcodes (Directives)
  785. All pseudo opcodes start with a ".". They are followed by 0, 1 or more expressions separated by commas (depending on the directive). The following table omits the pseudo opcodes, which include special information for debugging purposes (for GDB).
  786. .abort
  787. aborts the assembly on the point.
  788. .align {integer}
  789. aligns the current segment in size to {integer} power of 2. The maximum value of {integer} is 15. The lines
  790. .text
  791. some code ...
  792. .align 10               | 2^10 = 1024
  793. .data
  794. some more code ...
  795. .align 10               | 2^10 = 1024
  796. will create text and data sections, which both have the size 1024, although the actual code, that goes into the sections may be smaller.
  797. .ascii {string}[,{string},....]
  798. includes the {string}('s) in the assembly output.
  799. .asciz {string}[,{string},...]
  800. This directive is the same as above, but additionally appends a "\0" character to the string.
  801. .byte {expr}[,{expr},...]
  802. puts consecutive bytes with value {expr} into the output.
  803. .comm {identifier},{integer}
  804. creates a common area of {integer} bytes in the current segment, which is referenced by {identifier}. The {identifier} is visible from the outside of the module. It can therefore be used to resolve external reference from other modules.
  805. .data [{integer}]
  806. switches to DATA section {integer}. If {integer} is omitted, data section 0 is selected.
  807. .desc
  808. Whatsit good for ???
  809. .double {double}[,{double},...]
  810. puts consecutive doubles with value {double} into the output.
  811. .even
  812. sets the location counter of the current segment to the next even value.
  813. .file
  814. .line
  815. If a file is assembled, which was generated by a compiler or preprocessed by the C preprocessor, the input may contain lines like "# 132 stdio.h".  These lines are change by the assembler to the form
  816. .line 132
  817. .file stdio.h
  818. .fill {count},{size},{expr}
  819. puts {count} areas with {size} into the output. Each area contains the value {expr}.  {size} may be an even number up to or equal to 8. The line 
  820. .fill 3, 4, 0xa5a
  821. would put the following byte sequence in the output ("|" is only used to mark the size of the area.)
  822. 00 00 0a 5a | 00 00 0a 5a | 00 00 0a 5a 
  823. .float {float}[,{float},...]
  824. puts consecutive floats with value {float} into the output.
  825. .globl {identifier}[,{identifier},...]
  826. When labels or identifiers are assigned, they are only locally defined.  The ".globl" directive gives {identifier} external scope. The label can therefore be used to resolve external references from other modules.  {identifier} don't have to be assigned in the current module, but can be defined in another module.
  827. .int {expr}[,{expr},...]
  828. puts consecutive integers (32 bit) with value {expr} into the output.
  829. .lcomm {identifier},{integer}
  830. is basically the same as ".comm", except that area is allocated in the BSS segment. The scope of {identifier} is only local (only  visible in the module, where it is defined).
  831. .long {expr}[,{expr},...]
  832. same as "int".
  833. .lsym {identifier},{expr}
  834. sets the local {identifier} to the value of {expr}. The {identifier} is referenced by preceding it with a "L".  ("L{identifier}) (When I tried this, the linker threw a bomb. Trying again crashed the system.)
  835. .octa
  836. Whatsit good for ???
  837. .org {expr}
  838. sets the location counter of the current segment to {expr}.
  839. .quad
  840. Whatsit good for ???
  841. .set {identifier},{expr}
  842. sets {identifier} to the value of {expr}. If {identifier} is not explicitly marked external by the ".globl" directive, it has only local scope.
  843. .short {expr}[,{expr},...]
  844. puts consecutive shorts (16 bit) with value {expr} into the output.
  845. .space {count}, {expr}
  846. puts {count} consecutive number of bytes with value {expr} into the output. The line
  847. .space 5,3
  848. is equivalent to
  849. .byte 3, 3, 3, 3, 3
  850. The "space" directive is a special form of the "fill" directive.
  851. .text [{integer}]
  852. switches to TEXT section {integer}. If {integer} is omitted, text section 0 is selected.
  853. .word {expr}[,{expr},...]
  854. same as ".short".
  855. The Utilities
  856. This chapter describes the programs, which don't actually convert the source code into object code, but instead combine several object code modules to a runnable program or an object code library. Other programs can be used to print symbol information from either the object code or the executable. The last group of utility programs modify the executables in terms of memory usage and startup time.
  857. The Linker ("gcc-ld.ttp")
  858. A linker combines several object modules and extracts modules from a library to produce a runnable program. During this process all undefined symbol references are resolved. Additionally all sections from the object modules, which belong to either the TEXT, DATA or BSS are moved to the correct program segment. For example, all areas of all the object code modules, which have the type TEXT, are moved to form one large TEXT section. The same applies to the DATA and BSS sections.
  859. For the most time you don't have invoke the linker explicitly. The compiler driver does the job for you. But in case you have to, the general syntax is:
  860. gcc-ld [{options}] $GNULIB\crt0.o {file}.o -l{library}
  861. The above syntax assumes, that the executable is produced from C source code, which normally makes is necessary to link a startup module and a library. If an executable from a self contained assembler text is to be created, the startup module "crt0.o" and the library might be missing.  "gcc-ld.ttp" creates a file "a.out" by default. The linker can also append a DRI compatible or an extended symbol table to the executable.
  862. "gcc-ld.ttp" supports the following command line options.
  863. -f{load flags}
  864. Set the program load flags to {load flags}. The default program load flags is 7 (TT ram, fastload).
  865. -h{altheap size}
  866. Set the minalt size in the executable header to {altheap size}.  The default value is zero. Remember that value is specified in 128k units. What this means is (quoting mintsrc/mem.c): If (flags & F_ALTLOAD == 1), then we might decide to load in alternate RAM if enough is available. "enough" is: if more alt ram than ST ram, load there; otherwise, if more than (minalt+1)*128K alt ram available for heap space, load in alt ram ("minalt" is the high byte of flags).
  867. -l{library}
  868. Search {library} to satisfy unresolved references. The environment variable "GNULIB" is used to locate the library.  "GNULIB" contains a "," or ";" separated list of paths, each path without a trailing slash or backslash.
  869. -L{directory}
  870. Includes {directory} in the search path to locate a library.
  871. During the linking process extensive information about the encountered symbols is displayed.
  872. Instead of the standard DRI compatible symbol table, an extended symbol table is written, which allows symbol names to be up to 22 characters long. Most of the other utility programs have been updated to work with this format. The most benefit you get with "gprof.ttp" and "szadb" (the adb-like debugger, originally written for the Sozobon C compiler by Johann Rueg and Don Dugger and later significantly improved by Michal Jaegermann).
  873. -o{filename}
  874. The resulting output of the linking process is written to {filename} instead to "a.out".
  875. prevents the linker from attaching a symbol table to the executable.
  876. During the linking process the files loaded and the modules extracted from a library are displayed.
  877. This option discards all local symbols from the DRI symbol table. All global symbols are left in place.
  878. sym-ld.ttp
  879. "sym-ld.ttp" is a special version of the linker. His sole purpose is to create a special symbol file used by the GNU debugger. The following example show the usage. ("$" is the prompt of a CLI, "*" is the GDB prompt, "#" marks a comment)
  880. $ gcc -c -g foo.c      # compile "foo.c"
  881. $ gcc -o foo.prg foo.o -lgnu # link with normal "gcc-ld.ttp"
  882. $ sym-ld -o foo.sym $(GNULIB)\crt0.o foo.o -lgnu
  883.                        # (or -lgnu16 if you use -mshort)
  884.                        # link with "sym-ld.ttp" to get symbol file
  885. $ gdb
  886. * exec-file foo.prg    # executable ("gcc-ld.ttp" linked Atari executable)
  887. * symbol-file foo.sym  # symbols file ("sym-ld.ttp -o" linked)
  888. * run
  889. * <start doing gdb commands here>
  890. $                      # back
  891.   Note the line in the example, where "sym-ld.ttp" is invoked. A library "gnugdb.olb" is used to create the symbol file. This is just like the normal library "gnu.olb" except, that is was compiled with the "-g" option. If you don't have this library, use the normal library ("-lgnu"). In this case you can't single step through library functions at the source level. Also note, that "sym-ld.ttp" is invoked without the "-r" option. This option was only necessary for some very early versions of "gdb".
  892.   For a bit more detailed info about debugging with "gdb" turn to chapter 
  893. Debugging
  894. The Archiver "gcc-ar.ttp"
  895. The archivers main purpose is to make things in programming life easier. The archiver combines several object modules into one large library. At a later time the linker will then retrieve the modules needed to resolve all references. Without the library you would have to supply all modules by hand on the command line or the linker would have to search through all the files to resolve the references (The library "gnu.olb" contains around 150 modules).
  896. The general syntax for invoking "gcc-ar.ttp" is:
  897. gcc-ar {option} [{position}] {library} [{module}]
  898. The {option} specifies the action to be taken on the {library} or a {module} of that {library}.  {option} also includes modifiers for the action. The optional {position} argument is a member of the {library}. It is used, to mark a specific position in the {library}; an "add" operation would than place a new module before or after that {position}. The next argument specifies the library. The recommended naming convention for the creation of a new libraries is {library}.olb. If you don't use this convention, the compiler driver "gcc.ttp" will have trouble finding them.  {module} is usually an object code file generated by the compiler.
  899. "gcc-ar.ttp" supports the following command line options. If you don't use a {position} the named module is appended or moved to the end of the library
  900. The "add", "replace" or "move" operation should place the "module" 
  901. after
  902.  "position".
  903. The "add", "replace" or "move" operation should place the "module" 
  904. before
  905.  "position".
  906. If the specified "library" does not exist, it is silently created. Without this option "gcc-ar.ttp" would give you a notice, that it created a new library.
  907. deletes "module" from the "library".
  908. This is the same as option "b".
  909. This option is ignored. (Why is there in the first place ??)
  910. Move a member around inside the library.
  911. preserves the modification time of a module, that is extracted from the library.
  912. This option pipes the specified "module" directly to "<stdout>".
  913. A quick append is performed.
  914. causes "module" to be replaced. If the named module is not already present, it is appended. This is also the default action, when no "option" is given.
  915. creates special member in the library called "__.SYMDEF", which contains a directory of the external names defined by all the other members.
  916. lists the members, that are currently in the "library". If the option "v" is also given, additional information about file permissions, user- and group-id's and last modification date of the members are displayed. Of course, file permissions and user- and group-id's don't make much sense on the Atari ST.
  917. If this option is given, an existing module in the library is only replaced, if the modification time of the new module is newer than the modification time of the one already in the library.
  918. gives you some additional information depending on the operation, that currently performed.
  919. Extract "module" from the "library".
  920. Listing Symbols
  921. There are two programs available for printing symbols; each for symbols of a different kind.  "gcc-nm.ttp" list symbols in GNU object files and object libraries.  "cnm.ttp" lists symbols from a DRI compatible or extended symbol table attached to an executable.
  922. gcc-nm.ttp
  923. The output of  "gcc-nm.ttp" looks like the following sample:
  924. 00000870 b _Lbss
  925.          U _alloca
  926. 000003b4 t _glob_dir_to_array
  927. 00000532 T _glob_filename
  928. 00000248 T _glob_vector
  929.          U _malloc
  930. 0000086c D _noglob_dot_filenames
  931.          U _opendir
  932.          U _readdir
  933. 00000000 t gcc_compiled.
  934. The first column displays the relative address of that symbol in the object file. If the symbol has the type "U" (undefined external) the space in left blank. The next column shows the type of the symbol. In general, symbols, which have an external scope (visible for other object module) are marked with an uppercase letter. Symbols, which are local to the object file are marked with lowercase letters. The following letters are possible:
  935. marks variables, which are defined in that source module, but not initialized. A declaration like
  936. int variable;
  937. would create a line marked with a "C". The first column would  show the size of that variable in bytes instead of the relative address in the object module.
  938. Variables, which are declared with
  939. static int variable;
  940. are displayed with a "b".
  941. marks variables, which are initialized at declaration time. A declaration like
  942. int variable = 1;
  943. would show as a line with a "D" in it.
  944. Variables, which are initialized at declaration time declared are displayed with a "d". A declaration like
  945. static int variable = 1;
  946. would create a line marked with a "d".
  947. mark text (in other words: actual program code). Functions in your C source, which have the storage class "static", would be displayed with a "t". All other functions in that source module, which are visible to other modules, would show up with a "T".
  948. All functions, which are defined in other modules and referenced in this module, are displayed with a "U".
  949. The last column shows the symbol name.
  950. "gcc-nm.ttp" supports the following command line options.
  951. In case a file is compiled with the "-g" or "-gg" option, special information for debugging purposes is included in the object code. This information is listed by supplying the "-a" option.
  952. This option restricts the output to include only symbols, which have an external scope.
  953. Without any options the output is sorted in ascii order. By supplying the "-n", the listing is sorted in numerical order by the addresses in first column.
  954. If this option is given, every output line is preceded by a filename in the form "file:", naming the file in which the symbol appears. If the file to be listed, is an archive, the line begins in the form "library(member):".
  955. The symbols are listed in the order as they appear in the object code module.
  956. The output is sorted in reverse ascii order.
  957. Archives may contain a special member called "__.SYMDEF". Don't ask me about it purpose. Anyway, using this option show the content of this member.
  958. Only undefined symbols are listed.
  959. cnm.ttp
  960. "cnm.ttp" prints the symbols which are attached to an executable.
  961. Modifying the Executables
  962. The programs, which are described in the following sections can be used to modify an already existing executable, but this only works under the assumption, that the symbol table is still attached to the executable. So, if you want to modify the memory usage of a program at a later time, you should keep the unstripped executables around or use the command "xstrip.ttp" and keep only the "_stksize" symbol.
  963. fixstk.ttp
  964. "fixstk.ttp" is used to modify the current stacksize of an executable.  It does this by looking up the symbol "_stksize" in the symbol table portion of the file and than changes the values of the location where "_stksize" points to. The usage is:
  965. fixstk {size} [{filename}]
  966. {size} is the stacksize in Bytes, KBytes or MBytes. To specify {size} in Kbytes or Mbytes, append a "K" or a "M" to the integer number.
  967. For dumping applications like Scott Kolodzieski's port of GNU Emacs 18.57 "fixstk.ttp" looks up the symbol "_initial_stack" instead of "_stksize".
  968. fixstk 128K gcc-as.ttp
  969. sets the stacksize of "gcc-as.ttp" to 128 Kbytes.
  970. toglclr.ttp
  971. toglclr [-fload] [-frun] [-fram] {files} ...
  972. -fload
  973. Toggle the "fast load" flag.
  974. -frun
  975. Toggle the "fast run" flag.
  976. -fram
  977. Toggle the "fast ram malloc" flag.
  978.   If TOS launches an application, it clears all memory starting from the BSS section to the end of the TPA. With earlier TOS versions (pre TOS 1.4) this could take quite a considerable amount of time. The clearing algorithm was improved during the different TOS releases, but it is still used, although 
  979.  of the existing programs don't need a cleared memory. Well, most is not all; therefore for compatibility sake the feature will stay in place.
  980.   With TOS 1.4 you can keep the GEMDOS loader from clearing all memory.  The long word with offset 0x16 in the program header is used to determine whether the memory should be cleared or not. Setting the bit 0 of this longword to 1 prevents the loader from clearing all memory.  "toglclr.ttp" serves exactly that purpose, namely toggling this long word.
  981.   TOS 2.x and 3.x gave another two bits in the above mentioned longword a meaning. The "fast run" bit 1 is used to determine, if a program should be started in ordinary ST-ram (bit 1 = 0) or in alternate ram. In
  982. case of the TT or the SST68030 from Dave Small, this is ram which is not slowed down by any video hardware.
  983.   The "fast ram malloc" bit 2 determines, if any subsequent malloc's, which a program might do, should be satisfied from slow ST-ram (bit 2 = 0) or from alterate ram. All these flags have been introduced to increase compatibility between the different TOS versions.
  984. xstrip.ttp
  985.   "xstrip.ttp" removes the symbol table from a TOS executable file.  The default behaviour, which is to completely remove the symbol table, may be modified by specifying additional command line optione. The systax for the xstrip command is
  986. xstrip [-a] [-g] [-k] [-l {names}] {files} ...
  987. Really remove all of the symbol table. Leave nothing.
  988. This option causes "xstrip.ttp" to keep all global symbols.
  989. keeps the "_stksize" symbol, so that the stack size can be adjusted even for a nearly-stripped GCC produced executables.
  990. -l {names}
  991. keeps all symbols listed in a file {names} (one symbol per line).
  992. Both "-k" and "-l" options convert the extended symbols into regular ones (DRI compatible).
  993. Getting Information about Executables
  994. printstk.ttp
  995. "printstk.ttp" works basically the same way as "fixstk.ttp", but displays the current value at the location "_stksize" or "_initial_stack". The usage is:
  996. printstk [{filename}]
  997. If {filename} is not specified it defaults to ".\gcc-cc1.ttp".  If "printstk.ttp" is used on some of the executables of the GCC distribution, you should see a value of "-1", which means that all available memory is used by the program (at least for the programs "gcc-cpp.ttp" and "gcc-cc1.ttp").
  998. size68.ttp
  999.   "size68.ttp" is used to print information, which is found in the the header of an executable program file. A sample output is shown in the following lines.
  1000. c:\ => size68 temacs 
  1001. temacs: 
  1002.         text size       245884 
  1003.         data size       160604 
  1004.         bss size        11552 
  1005.         symbol size     36274 
  1006.         File is relocatable 
  1007.         BSS and high mem cleared on startup 
  1008.   The value of "text size" is the actual size of the program code; the TEXT segment. The value of "data size" gives the size of initialized data; the DATA segment. For example, if you define a variable "char array[10] = "foobar";", the string "foobar" is moved to the data segment during the linking process. The value of "bss size" is the size of the BSS segment. If you define a global variable "char array[10];", this variable "array" would end up the BSS segment. The BSS segment is initialized to zero from the GEMDOS loader, when the program is loaded into memory. The memory usage during the programs runtime can't simply be calculated by adding the three values, since this doesn't take into account the memory, which might be dynamically allocated.
  1009.   The value of "symbol table" is the size of the symbol table, which is appended to the three segments. The symbol table is only used, when the program is invoked under the control of a debugger. The symbol table doesn't use up any memory, when the program is launched from the desktop or a CLI. The next line says, that the program file is relocatable. As far as I know is every program file relocatable on the
  1010. ST. The last line indicates, that the BSS section and the all available memory ("high mem") is cleared upon startup. On systems with lots of memory, this can take quite a bit of time. You can keep the GEMDOS loader from clearing all memory by toggling a bit in the header. See "toglclr.ttp" for more info.
  1011. Debugging Programs
  1012.   In general, you have two choices for debugging; machine and source level debugging. Most of the time you will prefer the source level debugging. 
  1013. This chapter is not ready yet. If you have some ideas, what should go into this section, please tell me.
  1014. Swiss 721
  1015.